package es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.delegate;

import java.io.Serializable;
import java.sql.Date;

import es.udc.fbellas.j2ee.tiendaweb.model.direccionpostal.TO.DireccionPostalTO;
import es.udc.fbellas.j2ee.tiendaweb.model.tarjetabancaria.TO.TarjetaBancariaTO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuario.TO.UsuarioProfileTO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.TO.LoginResultTO;
import es.udc.fbellas.j2ee.tiendaweb.model.usuariofacade.exceptions.IncorrectPasswordException;
import es.udc.fbellas.j2ee.util.exceptions.DuplicateInstanceException;
import es.udc.fbellas.j2ee.util.exceptions.InstanceNotFoundException;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;

/**
 * A facade to model the interaction of the user with the portal. There exist
 * some logical restrictions with regard to the order of method calling. 
 * In particular, <code>findUserProfile</code>,  
 * <code>updateUserProfileDetails</code> and <code>changePassword</code> can 
 * not be called if <code>login</code> or <code>registerUser</code> have not 
 * been previously called. After the user calls one of these two methods, the 
 * user is said to be authenticated.
 */
public interface UsuarioFacadeDelegate extends Serializable {

    public void registrarUsuario(UsuarioProfileTO usuarioProfileTO, DireccionPostalTO direccionPostalTO, TarjetaBancariaTO tarjetaBancariaTO)
        throws DuplicateInstanceException, InternalErrorException;

    public LoginResultTO login(String loginName, String password,
        boolean passwordIsEncrypted)
        throws InstanceNotFoundException, IncorrectPasswordException,
            InternalErrorException;
        
    public UsuarioProfileTO buscarUsuarioProfile() throws InternalErrorException;

    public TarjetaBancariaTO buscarTarjetaUsuario() throws InternalErrorException;

    public DireccionPostalTO buscarDireccionUsuario() throws InternalErrorException;

    public void modificarUsuarioProfile(String nombre, String apellidos, String email, String language, String country)
        throws InternalErrorException;
    
    public void modificarTarjeta(UsuarioProfileTO usuarioProfileTO, TarjetaBancariaTO tarjetaBancariaTO)
    	throws InternalErrorException;
    
   public void modificarDireccion(UsuarioProfileTO usuarioProfileTO, DireccionPostalTO direccionPostalTO)
		throws InternalErrorException;
    

    public void cambiarPassword(String oldClearPassword, 
        String newClearPassword) throws IncorrectPasswordException,
        InternalErrorException;

}
